/* vue */
import { defineComponent } from "vue";
/* fake hooks */
import { useFormMultiLanguage } from '@hooks/useFormMultiLanguage'
/* model */
import { isArray, isFalsy, isNotEmpty } from "@src/util/type";
/* type */
import { PropType } from "vue";
/* service */
import { 
  isConnectorField,
  isCurrencyField,
  isEmailField,
  isEngineerQualificationField,
  isFaultLibraryField,
  isInfoField,
  isMaterialReturnField,
  isMaterialVerifyEliminateField,
  isProductWarrantyServiceField,
  isRelatedFormField,
  isRelatedProductField,
  isRelatedTaskField,
  isSeparatorField, 
  isServiceItermField, 
  isServiceProviderQualificationField, 
  isServiceProvidersField, 
  isSparepartField,
  isQualityInfoField,
  isSparePartsReturnExpenseField,
  isJsCodeBlockField
} from "@service/FieldService";
/* locales */
import i18n from '@src/locales'
/* util */
import { isBasicEditionHidePart, isBasicEditionHideProduct, isBasicEditionHideServe } from "@shb-lib/version";
import { getRootWindow } from "@src/util/dom";
import { FieldManager } from '@src/component/form/components/index';
import { getActivateControlFields } from '@src/component/form/util/index.js'
/* mixin */
/* version control mixin */
import { 
  VersionControlProductMixin, 
  VersionControlFormMixin,
  VersionControlOtherMixin,
  VersionControlTaskMixin
} from '@src/mixins/versionControlMixin'

type GroupField = {
  // 组件显示名称
  name: string;
  displayName?: string;
  // 组件类型
  formType: string;
  // 字段名，部分系统字段会提供
  fieldName: string;
  // 是否为为系统组件
  isSystem: number;
  // 是否为系统控件
  isSystemControl: boolean;
}

type FieldControlType = {
  name: string;
  typeKey: number;
  field: GroupField[];
  type?: string;
}

const { internationalGray } = useFormMultiLanguage()

export default defineComponent({
  name: 'form-design-mixin',
  mixins: [
    VersionControlFormMixin,
    VersionControlOtherMixin,
    VersionControlProductMixin,
    VersionControlTaskMixin,
  ],
  props: {
    /** 公共字段 */
    commonFields: {
      type: Array as PropType<GroupField[]>,
      default: () => ([])
    },
    mode: {
      type: String,
      default: ''
    },
    isOpenQuality: {
      type: Boolean,
      default: false
    },
  },
  data() {
    return {
      availableFields: [] as GroupField[],
      showJsCodeBlock: false
    }
  },
  computed: {
    /** 
     * @description 基础控件
    */
    _baseFields(): GroupField[] {
      return this.availableFields.filter(this.isBaseField);
    },
    /** 
     * @description 系统控件
    */
    _systemFields(): GroupField[] {
      return this.availableFields.filter(this.isSystemField);
    },
    /** 
     * @description 布局控件
    */
    _layoutFields(): GroupField[] {
      return this.availableFields.filter(this.isLayoutField);
    },
    /** 
     * @description 根据不同条件 过滤后支持显示的 基础控件
    */
    fieldControlsBaseFields(): GroupField[] {
      return [...this._baseFields.filter(this.filterBaseField), ...this.afterFieldControlsBaseFields];
    },
    /** 
     * @description 获取过滤掉的基础控件，如果是未开通的付费控件,并打上付费标签
    */
    afterFieldControlsBaseFields(): any[] {
      // 获取被过滤掉的基础控件
      const filterFields = this._baseFields.filter(field => !this.filterBaseField(field));
      // 获取所有没付费但是要显示出来的控件
      const needShowFields = getActivateControlFields(this.mode, 'fieldControls')?.filter(v =>!v.isSystem) ?? [];
      // 过滤出没付费但是要显示出来的控件
      const addTagsFields = filterFields.filter(v=> needShowFields.some(field => field.formType === v.formType))?.map(v => FieldManager.generatePaidTags(v)) ?? []
      return addTagsFields
    },
    /**
     * @description 根据不同条件 过滤后支持显示的 系统控件
     */
    fieldControlSystemFields(): GroupField[] {
      return [...this._systemFields.filter(this.filterSystemField), ...this.afterFieldControlSystemFields];
    },
    /** 
     * @description 获取过滤掉的系统控件，如果是未开通的付费控件,并打上付费标签
    */
    afterFieldControlSystemFields(): any[] {
      // 获取被过滤掉的基础控件
      const filterFields = this._systemFields.filter(field => !this.filterSystemField(field));
      // 获取所有没付费但是要显示出来的控件
      const needShowFields = getActivateControlFields(this.mode, 'fieldControls')?.filter(v =>v.isSystem) ?? [];
      // 过滤出没付费但是要显示出来的控件
      const addTagsFields = filterFields.filter(v=> needShowFields.some(field => field.formType === v.formType))?.map(v => FieldManager.generatePaidTags(v)) ?? []
      return addTagsFields
    },
    /** 
     * @description 根据不同条件 过滤后支持显示的 布局控件
    */
    fieldControlLayoutFields(): GroupField[] {
      return this._layoutFields.filter(this.filterLayoutField);
    },
    /** 
     * @description 基础控件数据
    */
    fieldControlBase(): FieldControlType {
      return {
        name: i18n.t('common.form.baseWidget') as string,
        typeKey: 0,
        field: this.fieldControlsBaseFields
      }
    },
    /** 
     * @description 系统控件数据
    */
    fieldControlSystem(): FieldControlType {
      return {
        name: i18n.t('common.form.systemWidget') as string,
        typeKey: 1,
        type: 'system',
        field: this.fieldControlSystemFields
      }
    },
    /** 
     * @description 通用控件数据
    */
    fieldControlCommon(): FieldControlType {
      
      this.commonFields.forEach(field => {
        field.name = field.displayName || ''
      })
      
      return {
        name: i18n.t('common.form.publicWidget') as string,
        typeKey: 2,
        field: this.commonFields
      }
    },
    /** 
     * @description 布局控件数据
    */
    fieldControlLayout(): FieldControlType {
      return {
        name: i18n.t('common.form.layoutWidget') as string,
        typeKey: 3,
        field: this.fieldControlLayoutFields
      }
    },
    /** 
     * @description 根据不同条件 过滤后支持显示 所有控件
    */
    fieldControls(): FieldControlType[] {
      
      const allControl = [
        this.fieldControlBase,
        this.fieldControlSystem,
        this.fieldControlCommon,
        this.fieldControlLayout,
      ]
      
      return (
        allControl.filter(control => {
          return isArray(control?.field) && isNotEmpty(control?.field)
        })
      )
      
    },
    /** 
     * @description 是否为 事件 表单设计器
    */
    _isEventMode(): boolean {
      return this.mode === 'event'
    },
    // 基础版功能是否隐藏产品
    isBasicEditionHideProduct() {
      return isBasicEditionHideProduct() 
    },
    // 基础版功能是否隐藏备件
    isBasicEditionHidePart() {
      return isBasicEditionHidePart()
    },
    // 基础版功能是否隐藏服务
    isBasicEditionHideServe() {
      return isBasicEditionHideServe()
    },
    // 是否开启云仓灰度
    isCloudWarehouse() {
      const RootWindow = getRootWindow(window)
      return Boolean(RootWindow.grayAuth?.taskCloudWarehouse)
    },
    // 是否开启服务商子表单灰度
    isServiceProviderSubForm() {
      const RootWindow = getRootWindow(window)
      return Boolean(RootWindow.grayAuth?.serviceProviderSubForm)
    },
    // 是否开故障库灰度
    isFaultLibrary() {
      const RootWindow = getRootWindow(window)
      return Boolean(RootWindow.grayAuth?.faultLibrary)
    },
    // 是否开始服务商灰度
    isProviderManager() {
      const RootWindow = getRootWindow(window)
      return Boolean(RootWindow.grayAuth?.providerManager)
    },
    // 是否有关联表单灰度
    isTaskSubForm() {
      const RootWindow = getRootWindow(window)
      return Boolean(RootWindow.grayAuth?.taskSubForm)
    },
    // 华大基因灰度
    isBgiSaas() {
      const RootWindow = getRootWindow(window);
      return Boolean(RootWindow.grayAuth?.bgiSaas)
    },
    // 是否开备件返还灰度
    isSparePartsReturnExpense() {
      const RootWindow = getRootWindow(window)
      return Boolean(RootWindow.grayAuth?.TASK_SPARE_PART_RETURN)
    },
  },
  methods: {
    /** 
     * @description 是否为布局控件
     * 1. 说明信息字段
     * 2. 或 分割线字段
    */
    isLayoutField(field: GroupField) {
      return isInfoField(field) || isSeparatorField(field)
    },
    /** 
     * @description 是否为系统控件
     * 1. 系统字段
     * 2. 系统控件
    */
    isSystemField(field: GroupField) {
      return Boolean(field?.isSystem) || Boolean(field?.isSystemControl)
    },
    /** 
     * @description 是否为基础控件
     * 1. 非布局控件
     * 2. 且非系统控件
    */
    isBaseField(field: GroupField) {
      // 是否为 布局控件
      const isLayoutField = this.isLayoutField(field);
      // 是否为 系统控件
      const isSystemField = this.isSystemField(field);
      
      // 是否为 非布局控件
      const isNotLayoutField = isFalsy(isLayoutField);
      // 是否为 非系统控件
      const isNotSystemField = isFalsy(isSystemField);
      
      // 非布局控件 且 非系统控件
      return isNotLayoutField && isNotSystemField;
    },
    /** 
     * @description 过滤布局控件
    */
    filterLayoutField(field: GroupField) {
      // 暂时不需要过滤，直接返回 true 即可
      return true;
    },
    /** 
     * @description 过滤基础控件
    */
    filterBaseField(field: GroupField) {
      
      // 是否为 关联产品 字段
      const _isRelatedProductField = isRelatedProductField(field);
      if (_isRelatedProductField) {
        return this.filterBaseFieldFieldRelatedProduct(field);
      }
      
      // 是否为 邮箱 字段
      const _isEmailField = isEmailField(field);
      if (_isEmailField) {
        return this.filterBaseFieldFieldEmail(field);
      }
      
      // 是否为 连接器 字段
      const _isConnectorField = isConnectorField(field);
      if (_isConnectorField) {
        return this.filterBaseFieldFieldConnector(field);
      }
      
      // 是否为 关联工单 字段
      const _isRelatedTaskField = isRelatedTaskField(field);
      if (_isRelatedTaskField) {
        return this.filterBaseFieldFieldRelatedTask(field);
      }
      
      // 是否为 关联表单 字段
      const _isRelatedFormField = isRelatedFormField(field);
      if (_isRelatedFormField) {
        return this.filterBaseFieldFieldRelatedForm(field);
      }

      // 代码块是否显示
      const isShowJsBlockField = isJsCodeBlockField(field)
      if(!this.showJsCodeBlock && isShowJsBlockField) {
        return false;
      }
      
      return true;
      
    },
    /** 
     * @description 基础控件 - 关联产品字段 - 过滤
    */
    filterBaseFieldFieldRelatedProduct(field: GroupField) {
      // 是否为 基础版功能隐藏产品，如果是则 返回 false 不显示
      return this.isBasicEditionHideProduct ? false : true;
    },
    /** 
     * @description 基础控件 - 邮箱字段 - 过滤
    */
    filterBaseFieldFieldEmail(field: GroupField) {
      return true
    },
    /**
     * @description 基础控件 - 连接器字段 - 过滤
    */
    filterBaseFieldFieldConnector(field: GroupField) {
      return this._isShowFormConnectorField
    },
    /**
     * @description 基础控件 - 关联工单字段 - 过滤
    */
    filterBaseFieldFieldRelatedTask(field: GroupField) {
      return this._isShowFormRelatedTaskField
    },
    /**
     * @description 基础控件 - 关联表单字段 - 过滤
    */
    filterBaseFieldFieldRelatedForm(field: GroupField) {
      
      // 是否为事件表单设计器，事件表单设计器需要根据版本判断是否显示
      if (this._isEventMode) {
        return this._isShowFormRelationFormField
      }
      
      return true;
    },
    /** 
     * @description 过滤系统控件
    */
    filterSystemField(field: GroupField) {
      
      // 是否为 备件 字段
      const _isSparepartField = isSparepartField(field);
      if (_isSparepartField) {
        return this.filterSystemFieldFieldSparepart(field);
      }
      
      // 是否为 服务项目 字段
      const _isServiceItermField = isServiceItermField(field);
      if (_isServiceItermField) {
        return this.filterSystemFieldFieldServiceIterm(field);
      }
      
      // 是否为 服务商 字段
      const _isServiceProvidersField = isServiceProvidersField(field);
      if (_isServiceProvidersField) {
        return this.filterSystemFieldFieldServiceProviders(field);
      }
      
      // 是否为 故障库 字段
      const _isFaultLibraryField = isFaultLibraryField(field);
      if (_isFaultLibraryField) {
        return this.filterSystemFieldFieldFaultLibrary(field);
      }
      
      // 是否为 物料返还 字段
      const _isMaterialReturnField = isMaterialReturnField(field);
      if (_isMaterialReturnField) {
        return this.filterSystemFieldFieldMaterialReturn(field);
      }
      
      // 是否为 物料核销 字段
      const _isMaterialVerifyEliminateField = isMaterialVerifyEliminateField(field);
      if (_isMaterialVerifyEliminateField) {
        return this.filterSystemFieldFieldMaterialVerifyEliminate(field);
      }
      
      // 是否为 服务商资质 字段
      const _isServiceProviderQualificationField = isServiceProviderQualificationField(field);
      if (_isServiceProviderQualificationField) {
        return this.filterSystemFieldFieldServiceProviderQualification(field);
      }
      
      // 是否为 工程师资质 字段
      const _isEngineerQualificationField = isEngineerQualificationField(field);
      if (_isEngineerQualificationField) {
        return this.filterSystemFieldFieldEngineerQualification(field);
      }
      
      // 是否为 关联表单 字段
      const _isRelatedFormField = isRelatedFormField(field);
      if (_isRelatedFormField) {
        return this.filterSystemFieldFieldRelatedForm(field);
      }
      
      // 是否为 产品质保 字段
      const _isProductWarrantyServiceField = isProductWarrantyServiceField(field);
      if (_isProductWarrantyServiceField) {
        return this.filterSystemFieldFieldProductWarrantyService(field);
      }
      
      // 是否为 货币 字段
      const _isCurrencyField = isCurrencyField(field);
      if (_isCurrencyField) {
        return this.filterSystemFieldFieldCurrency(field);
      }

      // 是否为 质保信息 字段
      const _isQualityField = isQualityInfoField(field);
      if (_isQualityField) {
        return this.filterSystemFieldFieldQualityInfo(field);
      }

      // 是否为 质保信息 字段
      const _isSparePartsReturnExpense = isSparePartsReturnExpenseField(field);
      if (_isSparePartsReturnExpense) {
        return this.filterSystemFieldFieldSparePartsReturnExpense(field);
      }
      
      return true;
      
    },
    /** 
     * @description 系统控件 - 备件字段 - 过滤
    */
    filterSystemFieldFieldSparepart(field: GroupField) {
      // 是否为 基础版功能隐藏备件，如果是则 返回 false 不显示
      return this.isBasicEditionHidePart ? false : true;
    },
    /**
     * @description 系统控件 - 服务项目字段 - 过滤
    */
    filterSystemFieldFieldServiceIterm(field: GroupField) {
      // 是否为 基础版功能隐藏服务，如果是则 返回 false 不显示
      return this.isBasicEditionHideServe ? false : true;
    },
    /**
     * @description 系统控件 - 服务商字段 - 过滤
    */
    filterSystemFieldFieldServiceProviders(field: GroupField) {
      // 是否开启了 服务商子表单 灰度
      return this.isServiceProviderSubForm;
    },
    /**
     * @description 系统控件 - 故障库字段 - 过滤
    */
    filterSystemFieldFieldFaultLibrary(field: GroupField) {
      // 是否开启了 故障库 灰度
      return this.isFaultLibrary;
    },
    /**
     * @description 系统控件 - 物料返还字段 - 过滤
    */
    filterSystemFieldFieldMaterialReturn(field: GroupField) {
      // 是否开启了 云仓 灰度
      return this.isCloudWarehouse;
    },
    /**
     * @description 系统控件 - 物料核销字段 - 过滤
    */
    filterSystemFieldFieldMaterialVerifyEliminate(field: GroupField) {
      // 是否开启了 云仓 灰度
      return this.isCloudWarehouse;
    },
    /**
     * @description 系统控件 - 服务商资质字段 - 过滤
    */
    filterSystemFieldFieldServiceProviderQualification(field: GroupField) {
      // 是否开启了 服务商 灰度
      return this.isProviderManager;
    },
    /**
     * @description 系统控件 - 工程师资质字段 - 过滤
    */
    filterSystemFieldFieldEngineerQualification(field: GroupField) {
      // 是否开启了 服务商 灰度
      return this.isProviderManager;
    },
    /**
     * @description 系统控件 - 关联表单字段 - 过滤
    */
    filterSystemFieldFieldRelatedForm(field: GroupField) {
      // 是否开启了 关联表单 灰度
      return this.isTaskSubForm;
    },
    /**
     * @description 系统控件 - 产品质保字段 - 过滤
    */
    filterSystemFieldFieldProductWarrantyService(field: GroupField) {
      // 是否开启了 华大基因 灰度
      return this.isBgiSaas
    },
    /**
     * @description 系统控件 - 货币字段 - 过滤
    */
    filterSystemFieldFieldCurrency(field: GroupField) {
      // 是否开启了 国际化 灰度
      return Boolean(internationalGray)
    },
    /**
     * @description 系统控件 - 质保信息 - 过滤
    */
    filterSystemFieldFieldQualityInfo(field: GroupField) {
      return this.isOpenQuality
    },
    /**
     * @description 系统控件 - 备件返还 - 过滤
    */
    filterSystemFieldFieldSparePartsReturnExpense(field: GroupField) {
      // 是否开启了 故障库 灰度
      return this.isSparePartsReturnExpense;
    },
  }
})